package com.cskaoyan.com.generic.generic5;


import com.cskaoyan.com.generic.generic1.MyDBLinkedList;

public class Demo2 {
    public static void main(String[] args) {


//        ① 泛型通配符<?>
//              代指任意类型，如果没有明确，那么就是Object以及任意的Java类了
//        ② ? extends E
//                向下限定，E及其子类
//        ③ ? super E
//                向上限定，E及其父类

        //  报错的原因是, 泛型不允许协变
//        MyDBLinkedList<S1> listS1 = new MyDBLinkedList<S1>();
//        MyDBLinkedList<F> listF = new MyDBLinkedList<F>();
//        listF = listS1; // 报错




//        泛型通配符<?>
//              代指任意类型，如果没有明确，那么就是Object以及任意的Java类了
//        MyDBLinkedList<?> listS1 = new MyDBLinkedList<S1>();
//        MyDBLinkedList<?> listS2 = new MyDBLinkedList<S2>();
//        MyDBLinkedList<?> listF = new MyDBLinkedList<F>();

//        ② ? extends E
//                代指向下限定，代指E 及 E的子类
//        MyDBLinkedList<? extends F> listF = new MyDBLinkedList<F>();
//        MyDBLinkedList<? extends F> listS1 = new MyDBLinkedList<S1>();
//        MyDBLinkedList<? extends F> listS2 = new MyDBLinkedList<S2>();

//        ③ ? super E
//                代指向上限定，代指E 及 E的父类
//        MyDBLinkedList<? super F> listF = new MyDBLinkedList<F>();
//        MyDBLinkedList<? super F> listS1 = new MyDBLinkedList<S1>();// 报错
//        MyDBLinkedList<? super F> listS2 = new MyDBLinkedList<S2>(); // 报错




//        MyDBLinkedList<?> listS1 = new MyDBLinkedList<String>();
//        listS1.add(new S1()); // 报错
//        listS1.add(new S2()); // 报错
//        listS1.add(new F()); // 报错
//        listS1.add(new Object()); // 报错

//        MyDBLinkedList<? extends F> listF = new MyDBLinkedList<S2>();
//        listF.add(new S1()); // 报错
//        listF.add(new S2()); // 报错
//        listF.add(new F()); // 报错
//        listF.add(new Object()); // 报错

        MyDBLinkedList<? super F> listF = new MyDBLinkedList<F>();
        listF.add(new F());
        listF.add(new S1());
        listF.add(new S2());
//        listF.add(new Object()); // 报错


    }
}
class F {}
class S1 extends F{}
class S2 extends F{}
